
#include "UnitType.h"
#include "OgreApplication.h"
#include <sstream>
#include <boost/format.hpp>

#include "LuaEng.h"
#include "luautils.h"

UnitType::UnitType() : masa(10), escudo(1000), casco(1000), energia(500),
regen_escudo(0), regen_energia(0), agresivo(false)
{

}

bool UnitType::Leer( std::string const & archivo )
{
	lua_State * L = OgreApplication::getInstance().GetLuaState();
	LuaEng::RunFile(L, archivo);

	tipo = lua_stringexpr(L, "Unidad.Nombre", "");
	lua_intexpr(L, "Unidad.Casco", &casco);
	lua_intexpr(L, "Unidad.Escudo", &escudo);
	lua_intexpr(L, "Unidad.Energia", &energia);
	modelo_fisico = lua_stringexpr(L, "Unidad.Fisico", "");
	lua_intexpr(L, "Unidad.Masa", &masa);
	estado_ai_inicial = lua_stringexpr(L, "Unidad.EstadoAIInicial", "");

	lua_numberexpr(L, "Unidad.RegenEscudo", &regen_escudo);
	lua_numberexpr(L, "Unidad.RegenEnergia", &regen_energia);

	agresivo = lua_boolexpr(L, "Unidad.Agresivo");

	int numMeshes = 0;
	lua_intexpr(L, "#Unidad.Mesh", &numMeshes);
	for(int i = 1; i <= numMeshes; ++i)
	{
		std::string expr = boost::str(boost::format("Unidad.Mesh[%1%]") % i);
		std::string mesh = lua_stringexpr(L, expr.c_str(), "");
		modelos.push_back(mesh);
	}

	return true;
}

bool UnitType::Valido() const
{
	if(tipo.empty())
		return false;
	if(modelos.empty())
		return false;
	for(int i = 0; i < modelos.size(); ++i)
		if(modelos[i].empty())
			return false;
	if(modelo_fisico.empty())
		return false;

	return true;
}